home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / ada / gwuada_9.zip / SSPANS.C < prev    next >
C/C++ Source or Header  |  1993-07-27  |  6KB  |  197 lines

  1. /*
  2.  * Copyright (C) 1985-1992  New York University
  3.  * 
  4.  * This file is part of the Ada/Ed-C system.  See the Ada/Ed README file for
  5.  * warranty (none) and distribution info and also the GNU General Public
  6.  * License for more details.
  7.  
  8.  */
  9. #include "hdr.h"
  10. #include "vars.h"
  11. #include "miscp.h"
  12. #include "setp.h"
  13. #include "smiscp.h"
  14. #include "sspansp.h"
  15.  
  16. static Span retrieve_l_span(Node);
  17. static Span retrieve_r_span(Node);
  18. static Span make_span(short, short);
  19.  
  20. int is_terminal_node(short node_kind)            /*;is_terminal_node*/
  21. {
  22.     return (
  23.       node_kind == as_string ||
  24.       node_kind == as_string_literal ||
  25.       node_kind == as_character_literal ||
  26.       node_kind == as_int_literal ||
  27.       node_kind == as_real_literal ||
  28.       node_kind == as_simple_name ||
  29.       node_kind == as_operator ||
  30.       node_kind == as_mode ||
  31.       node_kind == as_package_stub ||
  32.       node_kind == as_task_stub ||
  33.       node_kind == as_null ||
  34.       node_kind == as_null_s ||
  35.       node_kind == as_others ||
  36.       node_kind == as_generic ||
  37.       node_kind == as_line_no ||
  38.       /* these are added in the semantics */
  39.       node_kind == as_ivalue ||
  40.       node_kind == as_string_ivalue ||
  41.       node_kind == as_current_task ||
  42.       node_kind == as_number);
  43. }
  44.  
  45. Span get_right_span(Node node)            /*;get_right_span */
  46. {
  47.     Span rspan;
  48.  
  49.     rspan = retrieve_r_span(node);
  50.     if (rspan == (Span)0  && node != current_node)
  51.         rspan = retrieve_r_span(current_node);
  52.     if (rspan == (Span)0)
  53.         chaos("get_right_span: cannot find spans");
  54.     return rspan;
  55. }
  56.  
  57. Span get_left_span(Node node)            /*;get_left_span */
  58. {
  59.     Span lspan;
  60.  
  61.     lspan = retrieve_l_span(node);
  62.     if (lspan == (Span)0  && node != current_node)
  63.         lspan = retrieve_l_span(current_node);
  64.     if (lspan == (Span)0)
  65.         chaos("get_left_span: cannot find spans");
  66.     return lspan;
  67. }
  68.  
  69. static Span retrieve_l_span(Node node)             /*;retrieve_l_span */
  70. {
  71.     int i,listsize;
  72.     unsigned int nkind;
  73.     Span lspan = (Span)0 ;
  74.  
  75.     if (node == (Node)0 || node == OPT_NODE) return (Span)0;
  76.     nkind = N_KIND(node);
  77.     if (is_terminal_node(nkind)) return make_span(N_SPAN0(node),N_SPAN1(node));
  78.     if (nkind == as_exit) return retrieve_l_span(N_AST4(node));
  79.     if (nkind == as_return) return retrieve_l_span(N_AST4(node));
  80.     if (nkind == as_raise) return retrieve_l_span(N_AST2(node));
  81.     if (nkind == as_others_choice) return retrieve_l_span(N_AST3(node));
  82.     if (nkind == as_op)
  83.         /* N_AST1 is the operator. Really want first argument! */
  84.         if ((lspan=retrieve_l_span(N_AST2(node))) != (Span)0)
  85.             return lspan;
  86.     if (nkind == as_attribute)
  87.         /* N_AST1 is the attribute. Really want first argument! */
  88.         if ((lspan=retrieve_l_span(N_AST2(node))) != (Span)0)
  89.             return lspan;
  90.     if (N_LIST_DEFINED(nkind)) {
  91.         listsize = tup_size(N_LIST(node));
  92.         if (listsize == 0)
  93.             return (Span)0;
  94.         for (i=1; i <= listsize; i++) {
  95.             lspan = retrieve_l_span((Node)N_LIST(node)[i]);
  96.             if (lspan != (Span)0)
  97.                 return lspan;
  98.         }
  99.         return (Span)0;
  100.     }
  101.     if (N_AST1_DEFINED(nkind))
  102.         lspan = retrieve_l_span(N_AST1(node));
  103.     if (N_AST2_DEFINED(nkind) && lspan == (Span)0 )
  104.         lspan = retrieve_l_span(N_AST2(node));
  105.     if (N_AST3_DEFINED(nkind) && lspan == (Span)0 )
  106.         lspan = retrieve_l_span(N_AST3(node));
  107.     if (N_AST4_DEFINED(nkind) && lspan == (Span)0 )
  108.         lspan = retrieve_l_span(N_AST4(node));
  109.     return lspan;
  110. }
  111.  
  112. static Span retrieve_r_span(Node node)                 /*;retrieve_r_span */
  113. {
  114.     int i,listsize,length=1;
  115.     unsigned int nkind;
  116.     Span rspan = (Span)0 ;
  117.     Node attr_node;
  118.  
  119.     if (node == (Node)0 || node == OPT_NODE) return (Span)0;
  120.     nkind = N_KIND(node);
  121.     if (is_terminal_node(nkind)) {
  122.         if (N_VAL_DEFINED(nkind))
  123.             /* as_null, as_null_s, as_others, 
  124.              * have no N_VAL field defined
  125.              */
  126.             if (nkind != as_number && nkind != as_ivalue 
  127.               && nkind != as_line_no && N_VAL(node) != (char *)0)
  128.                 length = strlen(N_VAL(node));
  129.         return (make_span(N_SPAN0(node), N_SPAN1(node)+length-1));
  130.     }
  131.     if (nkind == as_exit) {
  132.         if (N_AST2(node) != OPT_NODE) return retrieve_r_span(N_AST2(node));
  133.         if (N_AST1(node) != OPT_NODE) return retrieve_r_span(N_AST1(node));
  134.         return retrieve_r_span(N_AST4(node));
  135.     }
  136.     if (nkind == as_return) {
  137.         if (N_AST1(node) != OPT_NODE) return retrieve_r_span(N_AST1(node));
  138.         return retrieve_r_span(N_AST4(node));
  139.     }
  140.     if (nkind == as_raise) {
  141.         if (N_AST1(node) != OPT_NODE) return retrieve_r_span(N_AST1(node));
  142.         return retrieve_r_span(N_AST2(node));
  143.     }
  144.     if (nkind == as_others_choice) {
  145.         if (N_AST2(node) != OPT_NODE) return retrieve_r_span(N_AST2(node));
  146.         if (N_AST1(node) != OPT_NODE) return retrieve_r_span(N_AST1(node));
  147.         return retrieve_r_span(N_AST3(node));
  148.     }
  149.     if (nkind == as_attribute) {
  150.         /* N_AST1 is number node representing attribute */
  151.         attr_node = N_AST1(node);
  152.         if (N_KIND(attr_node) == as_number)
  153.             /* due to errors, this is not necessarily the case */
  154.             length = strlen(attribute_str((int) N_VAL(attr_node)));
  155.         rspan = make_span(N_SPAN0(attr_node),
  156.           N_SPAN1(attr_node) + length - 1 );
  157.         return rspan;
  158.     }
  159.     if (nkind == as_entry_name || nkind == as_entry_family_name) {
  160.         /* N_AST3 gets temporarily overwritten with N_NAMES, 
  161.          * so ignore it 
  162.          */
  163.         return retrieve_r_span(N_AST1(node));
  164.     }
  165.     if (N_LIST_DEFINED(nkind)) {
  166.         listsize = tup_size(N_LIST(node));
  167.         if (listsize == 0)
  168.             return (Span)0;
  169.         for (i=listsize; i > 0; i--) {
  170.             rspan = retrieve_r_span((Node)N_LIST(node)[i]);
  171.             if (rspan != (Span)0)
  172.                 return rspan;
  173.         }
  174.         return (Span)0;
  175.     }
  176.     if (N_AST4_DEFINED(nkind))
  177.         rspan = retrieve_r_span(N_AST4(node));
  178.     if (N_AST3_DEFINED(nkind) && rspan == (Span)0 )
  179.         rspan = retrieve_r_span(N_AST3(node));
  180.     if (N_AST2_DEFINED(nkind) && rspan == (Span)0 )
  181.         rspan = retrieve_r_span(N_AST2(node));
  182.     if (N_AST1_DEFINED(nkind) && rspan == (Span)0 )
  183.         rspan = retrieve_r_span(N_AST1(node));
  184.     return rspan;
  185. }
  186.  
  187. static Span make_span(short line, short col)                /*;make_span */
  188. {
  189.     Span tok;
  190.  
  191.     tok = (Span) emalloct(sizeof(Span_s),"spans");
  192.     tok->line = line;
  193.     tok->col  = col;
  194.     return (tok);
  195. }
  196.  
  197.